844. 比较含退格的字符串
844. 比较含退格的字符串
分析
因为存在退格,因此无法通过顺序对比字符来比较两个字符串,因为你刚发现字符不一致,下一个就是退格符,得考虑退格符再比较。
因此思路就很简单了,要首先用一个方法把字符串中的退格操作做完拿到最终的字符串,再进行比较
解题
一开始是这么想的,既然退格符是向左删除,那我们从从右向左比较,遇到 #
就向左跳两个位置即可 ,但是后面发现不行,因为可能连续存在多个 ##
,连续两个 ##
的话,第二个 #
就被跳过去了,还是只能从左到右,严格按照 #
的定义来,遇到 #
就会退一个,因此
- 用双指针法,慢指针为指向退格之后的字符,
- 注意
#
的个数可能比#
的字符还要多,我们要保证慢指针最小为 0,不能为负数。
public boolean backspaceCompare(String s, String t) {
// 先获取最原始的字符串,
char[] sArray = getRawStr(s);
char[] tArray = getRawStr(t);
if(sArray.length!=tArray.length){
return false;
}
for(int i=0;i<sArray.length;i++){
if(sArray[i]!=tArray[i]){
return false;
}
}
return true;
}
public char[] getRawStr(String t){
char[] tArray = t.toCharArray();
int slow=0,fast=0;
for(;fast<tArray.length;fast++){
if(tArray[fast]=='#'){
// 通过移动慢指针实现删除元素
// 注意可能会删到小于0,因此slow如果已经是0了,就不要再删了
if(slow>0){
slow--;
}
}else{
tArray[slow] = tArray[fast];
slow++;
}
}
char[] target = new char[slow];
for(int i=0;i<target.length;i++){
target[i] = tArray[i];
}
return target;
}
相关题
27. 移除元素
26. 删除有序数组中的重复项
283. 移动零
977. 有序数组的平方
滑动窗口
209. 长度最小的子数组
904. 水果成篮